/**
 * 滚动位置管理工具
 * 用于在组件缓存时保存和恢复滚动位置
 */

class ScrollManager {
  constructor() {
    this.scrollPositions = new Map(); // 存储各页面的滚动位置
    this.scrollContainers = new Map(); // 存储滚动容器选择器
  }

  /**
   * 保存页面滚动位置
   * @param {string} routeKey 路由标识（通常是路由名称或路径）
   * @param {string} containerSelector 滚动容器选择器
   */
  saveScrollPosition(routeKey, containerSelector = 'body') {
    const container = document.querySelector(containerSelector);
    if (container) {
      this.scrollPositions.set(routeKey, {
        scrollTop: container.scrollTop,
        scrollLeft: container.scrollLeft,
        timestamp: Date.now()
      });
      this.scrollContainers.set(routeKey, containerSelector);
    }
  }

  /**
   * 恢复页面滚动位置
   * @param {string} routeKey 路由标识
   * @param {string} containerSelector 滚动容器选择器
   */
  restoreScrollPosition(routeKey, containerSelector = 'body') {
    const scrollData = this.scrollPositions.get(routeKey);
    const container = document.querySelector(containerSelector);
    
    if (scrollData && container) {
      // 使用 nextTick 确保 DOM 已更新
      setTimeout(() => {
        container.scrollTop = scrollData.scrollTop;
        container.scrollLeft = scrollData.scrollLeft;
      }, 0);
    }
  }

  /**
   * 清除指定页面的滚动位置
   * @param {string} routeKey 路由标识
   */
  clearScrollPosition(routeKey) {
    this.scrollPositions.delete(routeKey);
    this.scrollContainers.delete(routeKey);
  }

  /**
   * 清除所有滚动位置
   */
  clearAllScrollPositions() {
    this.scrollPositions.clear();
    this.scrollContainers.clear();
  }

  /**
   * 获取滚动位置信息
   * @param {string} routeKey 路由标识
   * @returns {Object|null} 滚动位置信息
   */
  getScrollPosition(routeKey) {
    return this.scrollPositions.get(routeKey) || null;
  }

  /**
   * 检查是否有保存的滚动位置
   * @param {string} routeKey 路由标识
   * @returns {boolean} 是否有保存的滚动位置
   */
  hasScrollPosition(routeKey) {
    return this.scrollPositions.has(routeKey);
  }

  /**
   * 清理过期的滚动位置（超过1小时）
   */
  cleanupExpiredPositions() {
    const now = Date.now();
    const oneHour = 60 * 60 * 1000;
    
    for (const [routeKey, scrollData] of this.scrollPositions.entries()) {
      if (now - scrollData.timestamp > oneHour) {
        this.scrollPositions.delete(routeKey);
        this.scrollContainers.delete(routeKey);
      }
    }
  }

  /**
   * 获取所有保存的滚动位置
   * @returns {Object} 所有滚动位置信息
   */
  getAllScrollPositions() {
    const result = {};
    for (const [routeKey, scrollData] of this.scrollPositions.entries()) {
      result[routeKey] = scrollData;
    }
    return result;
  }
}

// 创建单例实例
const scrollManager = new ScrollManager();

export default scrollManager; 